package com.ihy.service.impl;


import com.ihy.dao.mybatis.DaoSubscribe;
import com.ihy.entity.Subscribe;
import com.ihy.service.ServiceSubscribe;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 邮箱表业务层
 * <p>
 * Transactional注解：
 * 描述单个方法或类的事务属性。
 * 在类级别，此注解作为默认值应用于声明类及其子类的所有方法。注意，它不适用于类层次结构上的祖先类；方法需要在本地重新声明，以便参与子类级别的注解。
 * <p>
 * Service注解：
 * 表示带注解的类是“服务”，最初设计定义为“作为独立于模型中的接口提供的操作，没有封装状态。”
 * 还可能表示类是“业务服务外观”（在核心J2EE模式意义上）或类似的东西。
 * 此注解充当@Component的专门化，允许通过类路径扫描自动检测实现类。
 */
@Service
@Transactional
public class ServiceSubscribeImpl implements ServiceSubscribe {
    /**
     * Autowired注解:
     * 将构造函数、字段、setter方法或config方法标记为由Spring的依赖注入工具自动连接。
     * Autowired注解是按照类型（byType）装配依赖对象，默认情况下它要求依赖对象必须存在，如果允许null值，可以设置它的required属性为false。
     * 如果我们想使用按照名称（byName）来装配，可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下，会使用对象名作为最后的fallback匹配)
     */
    @Autowired
    private DaoSubscribe daoSubscribe;

    /**
     * 查询方法
     *
     * @param userid 用户标识
     * @return 邮箱信息
     */
    @Cacheable(key = "'subscribeIdIs'+#p0", value = "redisCacheTime")
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    @Override
    public Subscribe query(String userid) {
        return daoSubscribe.query(userid);
    }

    /**
     * 添加邮箱
     *
     * @param subscribe 邮箱对象
     * @return 添加状态
     */
    @CachePut(key = "#p0", value = "redisCacheTime")
    @Override
    public int insert(Subscribe subscribe) {
        return daoSubscribe.insert(subscribe);
    }

    /**
     * 修改邮箱
     *
     * @param subscribe 邮箱对象
     * @return 修改状态
     */
    @Override
    @CachePut(key = "#p0", value = "redisCacheTime")
    public int update(Subscribe subscribe) {
        return daoSubscribe.update(subscribe);
    }

    /**
     * 删除邮箱
     *
     * @param userid 用户标识
     * @return 删除状态
     */
    @Override
    @CacheEvict(key = "#p0", value = "redisCacheTime")
    public int delete(String userid) {
        return daoSubscribe.delete(userid);
    }
}